const bcrypt = require("bcrypt");
const jwt = require('jsonwebtoken');
const mysql = require("mysql");
require('dotenv').config();
const { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME, ACCESS_SECRET_KEY, REFRESH_SECRET_KEY} = process.env;

let db = mysql.createConnection({
    host: DB_HOST,
    port: DB_PORT,
    user: DB_USER,
    password: DB_PASSWORD,
    database: DB_NAME,
});

db.connect((err) => {
    if (err) {
        console.error('Ошибка подключения к базе данных:', err);
        //process.exit(1); // Прекращаем процесс в случае ошибки
        return;
    }
    console.log('Успешно подключен к БД..');
});

function loginHandler(req, res) {
    const { login, password } = req.body;

    // Проверяем, все ли поля предоставлены
    if (!login || !password) {
        return res.status(400).send('Необходимо заполнить все поля.');
    }

    // Ищем пользователя в базе данных
    db.query('SELECT * FROM Users WHERE login = ?', [login], (err, users) => {
        if (err) {
            return res.status(500).send('Ошибка при обращении к базе данных.');
        }
        if (users.length === 0) {
            return res.status(401).send('Пользователь не найден.');
        }

        const user = users[0];

        // Проверяем пароль
        const isMatch = bcrypt.compareSync(password, user.password);
        if (!isMatch) {
            return res.status(401).send('Неверный пароль.');
        }

        // Создаем токены
        const accessToken = jwt.sign(
            { id: user.id, name: user.name, role: user.role },
            ACCESS_SECRET_KEY,
            { expiresIn: '30m' });
        const refreshToken = jwt.sign(
            { id: user.id, name: user.name, role: user.role },
            REFRESH_SECRET_KEY,
            { expiresIn: '14d' });

        // Здесь мы отправим только accessToken в теле ответа, а refreshToken в куки
        return res
            .cookie("refresh_token", refreshToken, {
                httpOnly: true,
                secure: true,
                sameSite: 'strict'
            }) // Запись refreshToken в куки
            .status(200)
            .json({accessToken: accessToken}); // Обычно refreshToken не отправляется через тело ответа
    });
}
function tokenHandler(req, res) {
    const refreshToken = req.cookie.refresh_token;
    if (!refreshToken) {
        return res.sendStatus(401).send("Не авторизован, токен не предоставлен"); // Ответ "не авторизован", если токен не предоставлен
    }
    // Пытаемся подтвердить refresh токен
    jwt.verify(refreshToken, REFRESH_SECRET_KEY, (err, user) => {
        if (err) {
            return res.sendStatus(403).send('Запрещено, неверный или истекший токен'); // Ответ "запрещено", если токен неверный
        }
        const accessToken = jwt.sign(
            { id: user.id, name: user.name, role: user.role },
            ACCESS_SECRET_KEY,
            { expiresIn: '30m' });
        res.status(200).json({ accessToken });
    });
}
function logoutHandler(res) {
// Очищаем куки и отправляем подтверждение успешного выхода
    return res
        .clearCookie("refresh_token")
        .status(200)
        .json({ message: "Вы успешно вышли из системы. До встречи!" });
}

module.exports = {loginHandler, tokenHandler, logoutHandler};